#ifndef _VERTEX
#define _VERTEX

// INCLUDES --------------------------------------------------------------------
#include "base.h"

// DEFINES ---------------------------------------------------------------------

// TYPEDEFS --------------------------------------------------------------------
typedef struct // 3D cartesian
{
  union
  {
    fp x, y, z, w; // component style
    fp v[4];       // array style
  };
} vertex4;

// FUNCTIONS -------------------------------------------------------------------

/* GENERAL:
   d    -> destination
   s    -> source
   size -> array size (0,1 for single elements)

   a,b  -> two arbitrary vertices
   k    -> floating point scalar
*/
void vClear(vertex4 *v, ui32 size);                // clear to [0,0,0,1]
void vCopy(vertex4 *d, vertex4 *s, ui32 size);     // clone vector src->dest

fp   vMagnitude(vertex4 *v);                       // vector magnitude
void vNormalize(vertex4 *v);                       // normalize to [0.0f, 1.0f]
void vInvert   (vertex4 *v);                       // -(v)

fp   vScalarP(vertex4 *a, vertex4 *b);             // scalar product
void vVectorP(vertex4 *d, vertex4 *a, vertex4 *b); // vector product

void vAdd  (vertex4 *d, vertex4 *a, vertex4 *b);   // +
void vAddTo(vertex4 *d, vertex4 *a);               // +=

void vSub  (vertex4 *d, vertex4 *a, vertex4 *b);   // -
void vSubTo(vertex4 *d, vertex4 *a);               // -=

void vMul  (vertex4 *d, vertex4* a, fp k);        // *
void vMulTo(vertex4 *d, fp k);                    // *=

void vDiv  (vertex4 *d, vertex4* a, fp k);        // /
void vDivTo(vertex4 *d, fp k);                    // /=

bool vEquals  (vertex4 *a, vertex4 *b);            // ==
bool vInEquals(vertex4 *a, vertex4 *b);            // !=

#endif // _VERTEX
